/**
 * File:   Ihm.hpp
 * Author: CHABOT DIEP MYCEK
 *
 */

#ifndef _IHM_HPP
#define	_IHM_HPP

#include<iostream>
#include<string>
#include<limits>
#include "CaseMotsCroises.hpp"
#include "Grille.hpp"

using namespace std;

/**
\class Ihm
\brief Gestion de l'interface utilisateur
*/
class Ihm{
public :
	/**
	*\fn void afficher(Grille uneGrille)
	*\brief permet d'afficher une grille (de mots croises ou autre)
	*\param uneGrille une Grille
	*\return void
	*/
	void afficher(Grille uneGrille);
	
	/**
	*\fn void afficher(CaseMotsCroises uneCase)
	*\brief permet d'afficher une case de mots croises
	*\param uneCase une CaseMotsCroises
	*\return void
	*/
	void afficher(CaseMotsCroises uneCase);
	
	/**
	*\fn void ecrire(T message)
	*\brief permet d'afficher un message pour l'utilisateur
	*\param T un message de type quelconque
	*\return void
	*/
	template <typename T> void ecrire(T message){
		cout << message;
	}
	
	/**
	*\fn T demander(char *question, T reponse)
	*\brief permet de poser une question a l'utilisateur et de recuperer sa reponse
	*\param question un message (un char*)
	*\return T la reponse
	*/
	template <class T> T demander(string question){
		T reponse;
		ecrire<string>(question);
		cin >> reponse;
		if (cin.fail()){
			// échec
			cin.clear();
			cin.ignore(numeric_limits<char>::max(), '\n');
		}
		return reponse;
	}
	
	/**
	\fn void initEcran()
	\brief efface l'ecran.
	\return void
	*/
	void initEcran();
	
	/**
	\fn void sautLigne(int nb)
	\brief saute un certain nombre de lignes
	\param nb le nombre de lignes a sauter
	\return void
	*/
	void sautLigne(int nb);
	
	/**
	\fn char toMaj(char c)
	\brief transforme une lettre en majuscule (si elle ne l'est pas deja)
	\param c une lettre
	\return la lettre en majuscule
	*/
	char toMaj(char c);
	
    /**
    \fn bool fichierExiste(string chemin)
    \brief permet de tester l'existance d'un fichier (plus exactement verifie si on a les droits d'acces en lecture).
    \param chemin le chemin relatif du fichier dont on veut tester l'existance (chaine de caracteres)
    \return true si le fichier existe, false sinon.
    */
    bool fichierExiste(string chemin);
	
	/**
	\fn string demanderString(string question)
	\brief pose une question dont l'utilisateur doit repondre par une chaine de caracteres (qui peut contenir des espaces)
	\param question la question posee
	\return la chaine de caracteres entree par l'utilisateur
	*/
	string demanderString(string question);
	
	/**
	\fn void listerGrilles()
	\brief permet de lister toutes les grilles sauvegardees
	\return void
	*/
	void listerGrilles();
};
#endif	/* _IHM_HPP */
